Tema 05 - Análisis Exploratorio de Datos (AED)

Muestreo y Análisis de Datos - Universidad de Alicante

Pedro Albarrán

Dpto. de Fundamentos del Análisis Económico. Universidad de Alicante

De los datos en bruto a la información

  • AED es una fase inicial importante

    • conocer nuestros datos (qué variables, tipo de información, calidad)

    • encontrar escenarios de análisis

  • NO hay una “receta”: el proceso es diferente con distintos datos o con los mismos datos para diferentes objetivos

  • Es un proceso iterativo y creativo para descubrir información

    • Dada una pregunta, exploramos para aprender información útil, por sí misma o para posteriormente modelizar
    • PERO lo aprendido también refinar las preguntas y/o generar nuevas

Primera aproximación a los datos

  • Contexto: conocimiento previo de nuestros datos, aquí o aquí

    • fuente (de dónde han salido), cómo están almacenados (.csv, .xlsx, …)

    • “diccionario”: información de cada variable (descripción, unidades, etc.)

  • Cargar los datos
Bank <- read_csv2("data/BankMarketing.csv")
Boston <- read_csv("data/BostonHousing.csv")
  • Reconocimiento inicial de las características de los datos: número de observaciones y de variables, tipo de cada variable, etc.
glimpse(Bank)  # str(Bank)
View(Bank)     # head(Bank)
  • NO TODO lo que hagamos se incluirá en un documento para comunicar

Primera aproximación a los datos (cont.)

  • Limpiar y procesar los datos:

    • Debemos asegurarnos de que los datos son ordenados
    • ¿Tienen las variables la información y el tipo adecuado? Convertimos datos a factores, numéricas, etc.
    • Transformamos variables (logaritmos, discretizar variables continuas), creamos nuevas o renombramos para mayor claridad
    • ¿Mantenemos solo algunas variables u observaciones?
  • Un caso destacado: ¿cuántos NA? ¿qué hacer con ellos?

Bank %>%  is.na() %>% summary()
#
load("data/earn.RData")
earn %>% is.na() %>% summary()
  • NO ES UNA RECETA: más adelante puede que volvamos hacia atrás o rehagamos parte de esto y decidiremos sobre NAs al modelizar

Variación (“análisis univariante”)

  • Variación: tendencia de los valores de una variable a cambiar entre medidas

    • p.e., nivel educativo de dos personas (cualitativa) o ventas de dos empresas (continua)
  • Cada variable tiene su propio patrón de variación: esta información relevante se obtiene analizando su distribución de valores, númerica o gráficamente

    • summary() para calcular estadísticos básicos, y complementer con otros (varianza, percentiles, asimetría y kurtosis, etc.)
    • count() o table() (para frecuencias) y summarize() (con funciones para estadísticos)
summary(Bank)
  • Notar que el análisis es diferente para variables categóricas y numéricas: es conveniente describirlas por separado en un documento final

Visualizando distribuciones

  • Para Variables Categóricas, usamos histogramas (gráficos de barras):
g0 <- ggplot(data = Bank) 
g0 + geom_bar(aes(x = job)) + theme(axis.text.x = element_text(angle = 90))
g0 + geom_bar( aes(x = "", fill = education))
  • Para variables continuas, usar un histograma o densidad (o ambos)
g0 + geom_histogram(mapping = aes(x = age), binwidth = 5)
g0 + geom_density(mapping = aes(x = balance)) + scale_x_log10()
Boston %>%  ggplot(aes(x=medv)) + 
  geom_histogram(aes(y=..density..)) + geom_density() 
  • Consideramos varios anchos del intervalo: pueden revelar diferentes patrones
g0 + geom_histogram(mapping = aes(x = age), binwidth = 1)
g0 + geom_histogram(mapping = aes(x = age), binwidth = 10)

Visualizando distribuciones (cont.)

  • Los gráficos de caja también aportan información para distribuciones continuas
ggplot(Boston) + geom_boxplot(mapping = aes(y = medv))

Aspectos a prestar atención

  • Valores frecuentes, concentración en valores concretos (p.e., ceros, números “redondos”, etc.): ¿por qué se producen? ¿son “esperables”?
  • ¿Tienen sentido las categorías de las variables cualitativas?
    • agrupar valores con pocas observaciones
    • crear categorías más “finas”o más agregadas (ej. de países a continentes)
  • ¿Sería preferible discretizar alguna variable continua?

  • Variables con alta dispersión o distribución asimétrica (logs?)

  • Variables con información redundante, homogeneizar valores, normalidad(?)
  • Valores inusuales (“atípicos” o “outliers”): no encajan en el patrón general

    • ¿cambian los resultados del análisis sin ellos? ¿Qué los ha causado?

Otras herramientas para AED

  • Biblioteca skimr
library(skimr)
skim(Bank)   # ¿para incluir en un informe?
  • Biblioteca DataExplorer
library(DataExplorer)
plot_bar(Bank)        # para TODAS las variables categóricas
plot_histogram(Bank)  # para TODAS las variables numéricas
  • Útiles para una primera aproximación automática (qué patrones existen, qué cambiar), pero probablemente NO para incluir en un informe final

Otras herramientas: dlookr

  • describe(): estadísticos como un data frame, para usar con kable()
library(dlookr)            # en MacOS, puede pedir instalar XQuartz
describe(Bank, campaign:y)

Bank %>% describe() %>%
  select(described_variables, skewness, mean, p25, p50, p75) %>% 
  filter(!is.na(skewness)) %>% arrange(desc(abs(skewness)))

Bank %>%
  group_by(education) %>% 
  describe(age, balance, campaign, pdays) 
earn %>% eda_web_report()

Covariación: análisis multivariante

  • La variación describe el comportamiento dentro de una variable

  • La covariación describe relaciones entre variables: tendencia a que sus valores cambien juntos

  • Útil para formular modelos, que explican patrones complejos de los datos

    • ¿qué explica la relación sugerida por el patrón de covariación?

    • ¿cómo de fuerte es la relación?

    • ¿otras variables pueden afectar a la relación? ¿varían por subgrupos?

  • Covariación implica que los valores de una variable se pueden predecir a partir de otra

    • ¿es la covariación una relación causal?

Una variable continua y una categórica

  • ¿Es diferente la distribución de Y (continua) por categorías de X? Si \(\small{\Pr(Y|X=x_1) = \Pr(Y|X=x_0) = \Pr(Y)} \Rightarrow\) Y NO depende de X

1.- mediante el histograma o densidad (en el mismo gráfico o diferentes)

ggplot(Bank) + geom_density(aes(x = balance, color = default))  + scale_x_log10()
ggplot(Bank) + geom_density(aes(x = balance)) + facet_wrap(~default)  + scale_x_log10()
ggplot(Boston) + geom_density(aes(x=lstat, color=as.factor(chas))) 

2.- mediante gráficos de caja: menos información pero más fácil de comparar

ggplot(Boston) + geom_boxplot(aes(x=medv, y=as.factor(chas)))
ggplot(Bank) + geom_boxplot(aes(x=duration, y=as.factor(y)))
  • Si un grupo es mucho más pequeño, es difícil ver las diferencias

  • Se pueden necesitar reordenar las categorías de un factor, rotar los ejes, etc.

“Correlación” entre una variable continua y una categórica

  • La regresión simple también describe una relación: equivale a calcular la media de la variable continua por grupos definidos por la categórica

\[ E[Y|X]=\beta_0+\beta_1 X \Rightarrow \begin{cases} E[Y|X=0] &=\beta_0 \\ E[Y|X=1]&=\beta_0+\beta_1 \end{cases} \]

summary(lm(data = Bank, balance ~ default))
Bank %>% group_by(default) %>% summarise(media = mean(balance))

Bank %>% group_by(y) %>% summarise(media = mean(duration))
  • ¿Mediante la correlación? NO tiene sentido cuando una variable es categórica
  • Para variables dependientes categóricas veremos una variante de regresión lineal: regresión logística

Dos variables categóricas

  • Tabular/visualizar el número de observaciones para cada combinación
Bank %>% count(job, education) %>% pivot_wider(names_from = education, values_from = n)
ggplot(Bank, aes(y=job, x=education)) + geom_count() 
ggplot(Bank, aes(y=job, x=education)) + geom_count(aes(size=after_stat(prop), group=1)) 
  • También se pueden visualizar sus histogramas
Bank %>%  ggplot(aes(x=y)) + geom_bar(aes(fill=education)) 
Bank %>%  ggplot(aes(x=y)) + geom_bar(aes(fill=education), position="dodge2")
Bank %>%  ggplot(aes(x=y)) + geom_bar()+ facet_wrap(~education)
  • O los histogramas de proporciones generados manualmente
Bank %>% group_by(education, y) %>% summarise(n=n()) %>%  
   group_by(education) %>% mutate(prop=n/sum(n)) %>% 
   ggplot() + geom_bar(aes(x=education, y = prop), stat ="identity") + facet_wrap(~y)

Dos variables continuas

  • La forma obvia de visualizar relaciones entre variables continuas es un gráfico de dispersión; añadir smoothers ayuda a apreciar un patrón en los puntos
ggplot(Boston, aes(y=medv, x=lstat)) + geom_point() + geom_smooth()
ggplot(Boston, aes(y=medv, x=lstat)) + geom_point() + geom_smooth() +
  scale_y_log10()
library(GGally)
Boston %>% ggpairs()
  • Otra opción categorizar una variable continua y usar las técnicas anteriores
ggplot(Bank) + geom_boxplot(aes(x= balance, y=cut_width(age, 10)))  +
  scale_x_log10()
Bank %>% mutate(agegroup=cut(age, breaks=seq(20, 70, by=10))) %>% 
  ggplot()  + geom_boxplot(aes(x= balance, y =agegroup)) 

Correlación entre variables continuas

  • Obviamente podemos calcular modelos de regresión con dos variables continuas
summary(lm(data = Boston, medv ~ lstat) )
  • Y también correlaciones (dos variables, múltiples, visualizándolas)
cor(Boston$medv, Boston$lstat, use = "complete.obs")
Boston %>% select(medv, lstat) %>%  dlookr::correlate()

Boston %>%  dlookr::correlate()
Boston %>%  group_by(chas) %>%  dlookr::correlate() %>% plot()

library(corrplot)
corrplot(cor(Boston))
corrplot.mixed(cor(Boston))

Más herramientas de AED “automático”

  • Muchas partes del AED son parcialmente “automatizables”: muchos paquetes tratan de facilitar esas partes

  • Radiant, que puede probarse online

  • GwalkR, explore

library(GWalkR)
data(iris)
gwalkr(iris)
  • DataMaid, smartEDA
library(dataMaid)
makeDataReport(Bank, output = "pdf", replace = TRUE)
  • Otras partes y sobre la interpretación del AED es muy específica de los datos y del objetivo del estudio